草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - 空基类优化

下面是ebco上的简单测试,我在vc9和g++上都编译了。两个编译器的输出不同。我想知道的是vc的行为是否符合。#includeclassempty{};classempty_one:publicempty{};classempty_two:publicempty{};classnon_empty:publicempty_one,publicempty_two{};intmain(){std::cout(static_cast(&a[0]));void*pe20=static_cast(static_cast(&a[0]));std::cout(static_cast(&a[1]));

c++ - 从基类实例化派生对象

尝试创建一个Driver类型类,其中,下面的Base是在实例化时传递类型的Driver。类型,在本例中为2,用于构造正确的派生对象。我的编译器在“ClassBase”行抛出声明语法错误。我的最终目标是能够做到这一点:Base*B;B=newBase(2);if(B){B->DoStuff();B->DoMoreStuff();deleteB;}这是我无法编译的代码...classBase{public:Base(inth);virtual~Base();private:inthType;Base*hHandle;};classDerived1:publicBase{public:Der

c++ - 在基类中调用同名方法

基类A有一个子类B,B有一个子类C。A实现了一个虚方法doStuff(),B没有,C有。在C中,我想调用A的doStuff()实现(我在C中执行此操作是doStuff()的实现,但这并不重要。)我应该调用:A::doStuff();或者:B::doStuff();第一个看起来更清楚,因为它指的是实际实现。另一方面,如果我稍后决定B需要以不同于A的方式doStuff(),则第二个可能更有用。哪个更标准?哪个更危险?我有点惊讶B::doStuff()没有触发任何警告,但我想根据定义B有一个实现,即使它来自基类。基类和实现链可以任意长和复杂吗?例如,如果我有A到Z,每个都是前一个的子类,我可

c++ - 找不到基类模板的成员

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:WhydoIhavetoaccesstemplatebaseclassmembersthroughthethispointer?我有一个如下所示的类层次结构:templateclassBase{protected:Tt;};templateclassDerived:publicBase{public:Tget(){returnt;}};intmain(){Derivedd;d.get();}问题是protectedmembervariabletisnotfoundintheBaseclass.编译器输出:pr

c++ - 使用移动语义将基类实例插入子类实例

假设我有一个实例化的Baseb。Foo是Base的子类。我想要做的是拥有一个Foo的构造函数classFoo:publicBase{Foo(Baseb,TotherArg):Base(b){/*ToDo-dosomethingwithotherArg*/}}将“b”实例移动到正在构建的Foo实例。如果Foo的构造失败(例如,在我的/*ToDo步骤*/中),则不应移动b。我可以在C++11中执行此操作吗?(我买不起深拷贝)。构造函数原型(prototype)是否需要为Foo(Base&&b,TotherArg)? 最佳答案 是的,你可

c++ - 函数应该返回指向派生类还是基类的指针?

当一个函数需要返回一个对象时。它应该通过指向derived还是base的指针返回它?classB{}classD:publicB{}//way1:returnpointertoderivedD*createDerived(){D*d=newD();returnd;}//way2:returnpointertobaseB*createDerived(){B*d=newD();returnd;}我听说过“面向接口(interface)而不是实现的程序”,它建议我们应该返回一个指向基的指针。然而我的直觉告诉我在这种情况下最好返回一个指向派生的指针,因为如果客户端代码使用基指针,这个函数仍然可

c++ - 将从基类继承的构造函数与自定义构造函数混合

给定以下示例:structtag1{};structtag2{};templateclassBase{public:Base(T/*value*/){}Base(tag1){}};templateclassBase{public:Base(){}Base(tag1){}};templateclassMyClass:publicBase{public:usingBase::Base;MyClass(tag2):Base(tag1{}){}};intmain(){{MyClassdefaultConstructible;MyClasstagConstructible(tag2{});}{M

c++ - 从非模板基类扩展并覆盖函数参数的模板类

我正在尝试为PacketDecoder创建一个非模板基类,以便我可以将Base*存储在std::map中。解码功能被正确覆盖。编码函数给我这个错误“'编码'不是虚拟的,不能声明为纯”。我可能会从Java背景中错误地考虑这个问题。是否有更惯用的C++方法来解决这个问题?classBase{public:virtualPacket*decode(folly::io::Cursor&cursor)=0;virtualvoidencode(Packet*packet)=0;};template::value>::type*=nullptr>classPacketDecoder:publicBa

c++ - C++ 中的私有(private)基类可访问性

我最近不得不做这样的事情:classA{};classB:privateA{};classC:publicB{public:A*myA;};intmain(){return0;}而且我在尝试的三个编译器中都遇到了错误。当我将myA的声明更改为::A*myA时,一切正常。我查阅了C++标准,发现第11.2节第3段说:Note:Amemberofaprivatebaseclassmightbeinaccessibleasaninheritedmembername,butaccessibledirectly.哪个相关,但不清楚。为什么名称A不可访问?如果不隐藏A会出现什么问题?谢谢,-本

c++ - 我们是否应该从派生类调用基类移动复制/赋值构造函数

我知道,只要在派生类中定义了自定义复制构造函数或赋值运算符,那么这些方法就有责任调用基类的相应方法。现在我的重点是移动构造函数。假设以下是我的移动构造函数。我有两种调用基类构造函数的方法。取自hereDerived(Derived&&d):Base(d)-->FormA{}Derived(Derived&&d):Base(std::move(d))-->FormB{}现在哪种方法是正确的。根据我的理解和帖子的最后一个答案,使用FormB将是危险和不正确的,因为当调用派生类构造函数时对象将被取消。但是在formA中调用基类复制构造函数。调用FormA会更好吗?类似地,在移动复制赋值运算符